package main

import (
	"fmt"
	"sync"
)

// 泛型类型
// 实例化后的泛型类型，才能嵌入到其它类型中

// 基于切片，自定义类型
type Slice[T any] []T

func (sl Slice[T]) String() string {
	if len(sl) == 0 {
		return ""
	}

	var result = fmt.Sprintf("%v", sl[0])
	for _, v := range sl[1:] {
		result = fmt.Sprintf("%v,%v", result, v)
	}

	return result
}

type Lockable[T any] struct {
	t T
	// T // 编译报错！暂不支持类型参数作为成员嵌入到类型中
	Slice[int] // 实例化后的泛型类型，嵌入到另一个泛型类型
	sync.Mutex
}

type Foo struct {
	Slice[string] // 实例化后的泛型类型，嵌入到一个普通类型
}

func main() {
	n := Lockable[string]{
		t:     "hello",
		Slice: []int{1, 2, 3},
	}

	println(n.String())
}
